﻿using BLevy.Datos.Repositories;
using BLevy.Entidad;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace BLevy.Negocio
{
    public class CobradoresLiquidaciones
    {

        public static int Add(CobradorLiquidacion newEntity)
        {
            ICobradorLiquidacionRepository _repository = new CobradorLiquidacionRepository();
            int liquidacion_id = 0;
            bool resultado = true;
            try
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    liquidacion_id = _repository.Add(newEntity);
                    if (liquidacion_id > 0)
                    {
                        foreach (var fila in newEntity.detalle)
                        {
                            fila.cobradorliquidacion_id = liquidacion_id;
                            int detalle = _repository.AddDetalleLiquidacion(fila);
                            if (detalle > 0)
                            {
                                int cobro = _repository.RegistrarPagoLiquidacion(fila.cobradorcobro_id);
                                if (cobro == 0)
                                {
                                    resultado = false;
                                    liquidacion_id = 0;
                                    break;
                                }
                            }
                            else
                            {
                                resultado = false;
                                liquidacion_id = 0;
                                break;
                            }

                        }

                        if (resultado == true)
                        {
                            scope.Complete();
                        }
                    }
                    else
                    {
                        resultado = false;
                        liquidacion_id = 0;
                    }
                }
            }
            catch (Exception e)
            {
                throw e;
            }

            return liquidacion_id;
        }


        public static IList<CobradorLiquidacionDetalle> FindAllDetallesConCobradorFiltro(string numero_cupon, int? cobrador_id, DateTime? desde, DateTime? hasta)
        {
            try
            {
                ICobradorLiquidacionRepository _repository = new CobradorLiquidacionRepository();
                return _repository.FindAllDetallesConCobradorFiltro(numero_cupon, cobrador_id, desde, hasta);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<CobradorLiquidacionDetalle> FindByIdLiquidacion(int id)
        {
            try
            {
                ICobradorLiquidacionRepository _repository = new CobradorLiquidacionRepository();
                return _repository.FindByIdLiquidacion(id);
            }
            catch (Exception e)
            {
                throw e;
            }
        }


        public static IList<CobradorLiquidacion> FindAllConCobrador()
        {
            try
            {
                ICobradorLiquidacionRepository _repository = new CobradorLiquidacionRepository();
                return _repository.FindAllConCobrador();
            }
            catch (Exception e)
            {
                throw e;
            }

        }

        public static IList<CobradorLiquidacion> FindAllConCobradorFiltro(int? cobrador_id, DateTime? desde, DateTime? hasta)
        {
            try
            {
                ICobradorLiquidacionRepository _repository = new CobradorLiquidacionRepository();
                return _repository.FindAllConCobradorFiltro(cobrador_id, desde, hasta);
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static IList<CobradorLiquidacionDetalle> FindLiquidacionDetallesPorLiquidacionId(int liquidacion_id)
        {
            try
            {
                ICobradorLiquidacionRepository _repository = new CobradorLiquidacionRepository();
                return _repository.FindLiquidacionDetallesPorLiquidacionId(liquidacion_id);
            }
            catch(Exception e)
            {
                throw e;
            }
        }


        public static int CobradorLiquidacionPagoRegistrar(CobradorLiquidacionPago liquidacionpago)
        {
            int resultado_pago = 0;
            bool resultado = true;
            try
            {
                using (TransactionScope scope = new TransactionScope())
                {
                    ICobradorLiquidacionRepository _repository = new CobradorLiquidacionRepository();
                    resultado_pago = _repository.CobradorLiquidacionPagoRegistrar(liquidacionpago);

                    if (resultado_pago == 0)
                    {
                        resultado = false;
                        resultado_pago = 0;
                    }
                    else
                    {
                        int resultado_estado = _repository.CobradorLiquidacionCambiarEstado(liquidacionpago.cobradorliquidacion_id);
                        if (resultado_estado == 0)
                        {
                            resultado = false;
                            resultado_pago = 0;
                        }
                    }

                    if (resultado == true)
                    {
                        scope.Complete();
                    }
                }
            }
            catch(Exception ex)
            {
                throw ex;
            }

            return resultado_pago;
        }


        public static CobradorLiquidacion FindById(int id)
        {
            try
            {
                ICobradorLiquidacionRepository _repository = new CobradorLiquidacionRepository();
                return _repository.FindById(id);
            }
            catch (Exception e)
            {
                throw e;
            }
        }


    }
}
